/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package educar.abmFacultad;

import educar.controllers.PrincipalController;
import educar.db.JPA;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
/**
 *Esta clase funciona como mediador (escuchador), resepta(captura) los eventos de acciones,
 * de mouse y de ventana, esta clase se comunica con las clases EliminarFacultadController,
 * ModificarFacultadController,AgregarFacultadController, la clase FacultadController es 
 * invocada por la clase principal del sistema, la PrincipalController.
 * @author gaston
 */
public class FacultadController implements ActionListener,MouseListener, WindowListener {

    //Atributo usado para crear una instacia de la clase principal del sistema
    private PrincipalController principalController;
    
    //Atributo usado para crer una vista de facultad (ventana)
    private FacultadView facultadView;
    
// <editor-fold defaultstate="collapsed" desc="Constructor">
    /**
     * <hr>
     * FacultadController(): Constructor de la clase FacultadController
     * <hr>
     * @param principalControl 
     */
    public FacultadController(PrincipalController principalControl){ 
        principalController = principalControl;
        facultadView = new FacultadView();
        facultadView.setActionListener(this);
        facultadView.setMouseListener(this);
        facultadView.setWindowListener(this);
    }
 // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Action setView"> 
    /**
     * <hr>
     * setView(): Hace visible a una ventana de facultad.
     * <hr>
     */
    public void setView() {
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = 0;
        int y = 50;
        facultadView.setBounds(x, y, screen.width, (screen.height)-90);
        facultadView.setModeloTabla(null);
        facultadView.setVisible(true);
    }
// </editor-fold>    

// <editor-fold defaultstate="collapsed" desc="Metodos ActionPermormed">    
    @Override
    /**
     * <hr>
     * actionPerformed():metodo que recibe un evento de un boton y dependiendo de
     * este este evento puede eliminar, agregar o buscar una facultad.
     * <hr>
     * @param e 
     */
    public void actionPerformed(ActionEvent e) {
        //Atributo usado para verificar procedencia (boton)
        Object source = e.getSource();
        if (facultadView.getJbAgregar() == source) { //Boton Aceptar
                AgregarFacultadController agregarDocenteController = new AgregarFacultadController(this);
                agregarDocenteController.setView();
        }
        
        if (facultadView.getJbEliminar() == source) {//Boton Eliminar
            EliminarFacultadController eliminarFacultadController = new EliminarFacultadController();
            eliminarFacultadController.eliminarRegistro(facultadView.getModeloTabla());
        }    
        
        if (facultadView.getJbBuscar() == source) {//Boton Buscar
            facultadView.setModeloTabla(null);
            if (facultadView.getCriterio().isEmpty()){
                facultadView.setModeloTabla(ListarFacultad());
            }else{  
                facultadView.setModeloTabla(BuscarFacultad(facultadView.getCriterio()));
            }
        }       
    }//Fin del metodo actionPerformed
    
    @Override
    /**
     * <hr>
     * mouseClicked(): Metodo usado para detectar el evento del mause en la ventana de facultad
     * <hr>
     * @param e 
     */
    public void mouseClicked(MouseEvent e) {
        Object source = e.getSource();
        if ((facultadView.getJTFacultad() == source) && (e.getClickCount()==2)) {
            ModificarFacultadController modificarFacultadController = new ModificarFacultadController(this);
            int fila = facultadView.getJTFacultad().getSelectedRow();
            Vector registro = (Vector) (facultadView.getModeloTabla().getDataVector()).elementAt(fila);
            modificarFacultadController.setView(registro, fila);
        }    
    }
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Metodos auxiliares usados">  
    /**
     * <hr>
     * AgregarATabla():
     * <hr>
     * @param item 
     */
    public void agregarATabla(String[] item){
        Object[] vector = new Object[4];
        vector[0] = (boolean) false;
        for (int i = 1; i < 4; i++){
            vector[i] = item[i-1];
        }
        facultadView.getModeloTabla().addRow(vector);
    }

    
    /**
     * Lista todas las materias que dicta un facultad responsable.
     * @param materiaCriterio: es el dni del docente
     * @return 
     */
    public DefaultTableModel BuscarFacultad(String docenteCriterio) {
            JPA jpa = new JPA();
            Object[] vector = new Object[4];
            DefaultTableModel tabla = (DefaultTableModel) facultadView.getModeloTabla(); 
            ResultSet res = jpa.getByField("docente", "dni", docenteCriterio);
            try {
                while (res.next()) { //Existe siguiente registro.
                    vector[0] = false;
                    vector[1] = res.getObject(1);
                    vector[2] = res.getObject(2);
                    vector[3] = res.getObject(3); 
                    tabla.addRow(vector);
                }
            } catch (SQLException ex) { //No existe siguiente registro.
                ex.printStackTrace();
            }
            return tabla;       
    }
    
    /**
     * <hr>
     * ListarDocente(): Lista todas las facultades de la base de datos en la tabla
     * <hr>
     * @return 
     */
    public DefaultTableModel ListarFacultad() {
            JPA jpa = new JPA();
            Object[] vector = new Object[4];
            DefaultTableModel tabla = (DefaultTableModel) facultadView.getJTFacultad().getModel(); 
            ResultSet res = jpa.showAll("facultad");
            try {
                while (res.next()) {
                    vector[0] = false;
                    vector[1] = res.getObject(1);
                    vector[2] = res.getObject(2);
                    vector[3] = res.getObject(3); 
                    tabla.addRow(vector);
                }
            } catch (SQLException ex) {
            ex.printStackTrace();
            }
            return tabla;
    }
    
    
    public void actualizarFila(String[] item, int fila){
        facultadView.getModeloTabla().setValueAt(false, fila, 0);
        for (int i = 1; i < 9; i++){
            facultadView.getModeloTabla().setValueAt(item[i-1], fila, i);
        }
    }
    
    @Override
    public void windowClosing(WindowEvent e) {
            principalController.setView();
    }

// </editor-fold>    
    
// <editor-fold defaultstate="collapsed" desc="Metodos ActionPerformed no usadas"> 
    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    @Override
    public void windowOpened(WindowEvent e) {

    }

    @Override
    public void windowClosed(WindowEvent e) {

    }

    @Override
    public void windowIconified(WindowEvent e) {

    }

    @Override
    public void windowDeiconified(WindowEvent e) {

    }

    @Override
    public void windowActivated(WindowEvent e) {

    }

    @Override
    public void windowDeactivated(WindowEvent e) {

    }
// </editor-fold> 
    
}
